package data

import (
	"gitee.com/small_fish_official_net/beego_frame/bash"
	"github.com/astaxie/beego/logs"
	"github.com/astaxie/beego/orm"
)

type User struct {
	Id       uint   `json:"id"`       // 主键自增编号
	UserName string `json:"username"` // 用户名
	Password string `json:"-"`        // 用户密码（加密后）
	Email    string `json:"email"`    // 用户邮箱
	Phone    string `json:"phone"`    // 用户手机
	Status   uint8  `json:"-"`        // 用户状态
	Randcode string `json:"-"`        // 用户密码的随机掩码
	Sex      uint8  `json:"sex"`      // 性别，0未知，1男2女
	IsAdmin  bool   `json:"-"`        // 是否是后台admin用户，0否1是
	IsSupper bool   `json:"-"`        // 是否是超级管理员
	GroupId  int64  `json:"-"`        // 权限组ID
	Data
}

// 获取用户性别列表
func (c *User) GetSexList() []string {
	return []string{"未知", "男", "女"}
}

// 获取用户的状态列表
// 如果有新状态的话需要添加到最后方
func (c *User) GetStatusList() []string {
	return []string{"正常", "锁定", "禁止登录"}
}

// 获取性别信息
func (c *User) GetSex() string {
	return c.GetSexList()[c.Sex]
}

// 获取用户状态
func (c *User) GetStatus() string {
	return c.GetStatusList()[c.Status]
}

// 检测用户输入的密码是否正确
func (c *User) CheckPassword(password string) bool {
	addr := bash.Base64Encode(c.Randcode)
	passwd := bash.MD5(bash.MD5(bash.MD5(password+bash.MD5(password)+bash.MD5(addr)) + addr))
	return passwd == c.Password
}

// 重置用户密码数据
// 返回当前对象，需要手动操作存储
func (c *User) ResetPassword(password string) *User {
	c.Randcode = bash.StringToRand(10) // 生成10位随机码
	addr := bash.Base64Encode(c.Randcode)
	c.Password = bash.MD5(bash.MD5(bash.MD5(password+bash.MD5(password)+bash.MD5(addr)) + addr))
	c.UpdateTime = bash.DateTime()
	return c
}

// 用户初始化操作
// 直接插入admin用户，不会检测是否存在
func user_init() {
	o := orm.NewOrm()
	bash.UseType(o, "write")
	o.Begin()
	var user_admin = User{UserName: "admin", Sex: 0, IsAdmin: true, IsSupper: true}
	user_admin.ResetPassword("admin").InsertPrivate()
	_, err := o.Insert(&user_admin)
	if err != nil {
		o.Rollback()
		logs.Error("菜单数据插入失败：" + err.Error())
		return
	}
	o.Commit()
	return
}
